package cga.framework;

import java.util.Random;

public class Osobnik {

	private int[] chromosom;
	private int dlugoscChromnosomu = 0;
	private double poczatekX1;
	private double poczatekX2;
	private double koniecX1;
	private double koniecX2;
	private int iloscBitowX1;
	private int iloscBitowX2;
	
	public Osobnik(double poczatekx1, double koniecx1, double poczatekx2, double koniecx2, int dok){
		poczatekX1 = poczatekx1;
		poczatekX2 = poczatekx2;
		koniecX1 = koniecx1;
		koniecX2 = koniecx2;
		double przedzialx1 = ((koniecx1-poczatekx1)*Math.pow(10, dok));
		double przedzialx2 = ((koniecx2-poczatekx2)*Math.pow(10, dok));
		double calyPrzedzial = Math.abs(przedzialx1)+Math.abs(przedzialx2);
		int iloscBitowx1 = 0;
		while(przedzialx1>Math.pow(2, iloscBitowx1)){
			iloscBitowx1++;
		}
		iloscBitowX1 = iloscBitowx1;
		
		int iloscBitowx2 = 0;
		while(przedzialx2>Math.pow(2, iloscBitowx2)){
			iloscBitowx2++;
		}
		iloscBitowX2 = iloscBitowx2;
		
		dlugoscChromnosomu = iloscBitowx1+iloscBitowx2;
		
		chromosom = new int[dlugoscChromnosomu];
		Random generator = new Random();
		for(int i = 0; i<chromosom.length;i++){
			chromosom[i] = generator.nextInt(2);
		}
	}
	
	public void showChromosom(){
		for(int i = 0; i < chromosom.length; i++ ){
			System.out.print(chromosom[i]);
		}
		System.out.println();
	}
	
	/**
	 * Metoda oblicza wartosc reprezentacji przez pierwsza czesc chromosomu
	 * @return wartosc pierwszego chromosomu
	 */
	public double wartoscX1(){
		double wartosc;
		wartosc = poczatekX1 + ((zamiana("x1")*(koniecX1-poczatekX1))/(Math.pow(2, dlugoscChromnosomu))-1);
		return wartosc;
	}
	
	public int zamiana(String nazwa){
		int wynik = 0;
		if(nazwa=="x2"){
			int index = 0;
			for(int i = dlugoscChromnosomu; i > iloscBitowX1+1; i--){
				wynik = wynik+(chromosom[i]*(int)Math.pow(2, index));
				index++;
			}
		}
		else{
			int index = 0;
			for(int i = iloscBitowX1; i >= 0; i--){
				wynik = wynik+(chromosom[i]*(int)Math.pow(2, index));
				index++;
			}
		}
		return wynik;
	}

}
